import greenfoot.*; 
public class MundoSano extends World
{
    /**
    * @autor (Juarez Soto Luis Angel y Rangel Ramirez Juan Carlos) 
    * @versión (20/nov/2014)
    */

    private GreenfootImage imgL1;  /**Imagen de fondo del nivel 1.*/
    private GreenfootImage imgL2;  /**Imagen de fondo del nivel 2.*/
    private GreenfootImage imgL3;  /**Imagen de fondo del nivel 3.*/
    private GreenfootImage imgL4;  /**Imagen de fondo del nivel 4.*/
    private GreenfootImage imgL12;  /**Imagen de fondo del escenario para scroll.*/
    private int x1; /**posicion x de imagen 1Imagen de fondo del escenario.*/
    private int x2; /**posicion x de Imagen de fondo del escenario para scroll.*/
    private int velocidad;/** velocidad con la que el corredor avanzara y con la que se movera el scroll*/
    private int yAleatoria;/**posicion aleatoria para poner objetos en el escenario*/
    private int apareceEnX;
    private int apareceObs;
    private int vidas;
    private int salud;
    private int nivel;
    private int auxDistancia;
    private SimpleTimer distancia;//HERE
    private SimpleTimer reloj;
    
    private Counter msjReloj; 
    private Counter msjSalud;
    private Counter msjVidas; 
    private Counter msjDistancia;//HERE a
    
    private GreenfootSound soundFondo;//musica de fondo cuando el jugador corre
    private int contadorAuxiliar;//indica cada cuanto tiempo aparecera un nuevo objeto
    private int contadorDistancia;
    private int aumentaDistancia;
    
    /**Nuestro constructor de MundoSano crea nuestro escenario de 800 x 600
     * carga las imagenes del escenario para poder realizar el scroll, carga los 
     * marcadores como el reloj, salud, vidas y distancia y agrega al pesonaje 
     * 
     */

    public MundoSano(int unPersonaje)
    {          
        super(800, 600, 1, false);//Crea un nuevo mundo de 600x400 celdas con un tamaño de celda de 1x1 pixeles.
        nivel=1;
        imgL1 = new GreenfootImage("escenario1.jpg");/* agrega la primer imagen de fondo al escenario */
        imgL1.scale(800,600);/* escala la imagen a las medidas del escenario en caso de exceder las dimensiones */
        setBackground(imgL1);/* muestra la imagen en pantalla */
        imgL12 = new GreenfootImage("escenario1.jpg");/* imagen principal para scroll de escenario*/
        imgL12.scale(800,600);/* escala la imagen a las medidas del escenario en caso de exceder las dimensiones */
        imgL2 = new GreenfootImage("escenario2.jpg");/* imagen principal para scroll de escenario*/
        imgL2.scale(800,600);/* escala la imagen a las medidas del escenario en caso de exceder las dimensiones */        
        imgL3 = new GreenfootImage("escenario3.jpg");/* imagen principal para scroll de escenario*/
        imgL3.scale(800,600);/* escala la imagen a las medidas del escenario en caso de exceder las dimensiones */
        imgL4 = new GreenfootImage("escenario4.jpg");/* imagen principal para scroll de escenario*/
        imgL4.scale(800,600);/* escala la imagen a las medidas del escenario en caso de exceder las dimensiones */
        
        reloj=new SimpleTimer();
        reloj.mark();
        msjReloj=new Counter("Tiempo: ");
        msjReloj.setValue(0);
        addObject(msjReloj,50,20);
        
        msjSalud = new Counter("Salud: ");
        msjSalud.setValue(10);
        salud=10;
        addObject(msjSalud,200,20);
        
        vidas=3;
        msjVidas = new Counter("Vidas: ");
        msjVidas.setValue(3);//inicia las vidas en 3
        addObject(msjVidas,350,20);
        
        distancia=new SimpleTimer();
        distancia.mark();
        msjDistancia = new Counter("Distancia: ");
        msjDistancia.setValue(0);
        addObject(msjDistancia,500,20);
        
        soundFondo=new GreenfootSound("Happy2.mp3");//cancion de fondo del juego
        auxDistancia=0;
        apareceObs=0;
        aumentaDistancia=1000;
        apareceEnX=getWidth()-50;
        contadorAuxiliar=0;
        contadorDistancia=0;
        velocidad=1;
        
        if(unPersonaje==1)
            addObject(new Nino(), 100, 400);/*agrega un nuevo jugador niño*/
        else
            addObject(new Nina(), 100, 400);/*agrega un nuevo jugador niña*/
                   
        x1=velocidad;/* la primera accion del scroll es restar y se inicia asi para que quede en cero */        
        
    }
    
    /**El actua del escenario realiza el scroll necesario para aparentar de que
     * se esta moviendo el mundo y el personaje se esta desplazando.
     * Tambien si presionamos la tecla a se mueve mas lento el mundo
     * si presionamos s se mueve mas rapido, tenemos nuestro reloj que avanza cada segundo
     */
    public void act() 
    {
        soundFondo.playLoop();
        if(vidas!=0)
        {
            int contVel;
            contVel=velocidad;
            this.scroll();/*metodo para movimiento del escenario*/
            /*las siguientes acciones son para aumentar o reducir la velocidad manualmente por ahora solo es de prueba*/
            asignaVelocidad();
            if(reloj.millisElapsed()>=1000)
            {             
                reloj.mark();
                msjReloj.add(1);
                contadorAuxiliar++;
            }
        
            if(distancia.millisElapsed()>=aumentaDistancia && velocidad>0)
            {
                distancia.mark();
                msjDistancia.add(1);
                contadorDistancia++;
                auxDistancia++;
            }
            
            if(auxDistancia==500 && nivel<5)
            {
                nivel++;
                cambiaImagen();
                auxDistancia=0;
            }
            
            if(apareceObs<4)
                apareceObs=(msjDistancia.getValue()/1000);
            
            if(contadorAuxiliar==5-apareceObs)/*el primer random es para algun nuevo onjeto, la posicion aleatoria abarca entre 300 y 500 en Y*/
                agregaObjeto(Greenfoot.getRandomNumber(17)+1,Greenfoot.getRandomNumber(200)+300);
        }    
        else
        {
            //aqui iria el llamado al metodo para guardar los records
            soundFondo.stop();
            Greenfoot.playSound("gameOver.mp3");
            Letrero gameOver;
            gameOver = new Letrero("GAME OVER");
            records(contadorDistancia);
            addObject(gameOver,getWidth()/2,getHeight()/2); 
            fin();
            Greenfoot.stop();
        }
    }       
    
    /**
     * metodo que muestra los records al perder el juego
     */
    public void fin()
    {
        ScoreBoard scoreboard;
        scoreboard = new ScoreBoard(400,400);
        addObject(scoreboard, getWidth()/2,getHeight()/2);
    }
    
    /**Nuestro metodo agregarObjeto
     * @param int unObjeto, int yAleatoria
     * Agrega los objetos al mundo de forma aleatoria es decir, cada objeto tiene asignado un numero
     * el cual llega a la funcion y se compara en un switch y se agrega de forma aleatoria en una posion 
     * yAleatoria desde el inicio del mundo para que aparente que mientas va caminando el personaje aparescan 
     * nuevos objetos
     */
    public void agregaObjeto(int unObjeto, int yAleatoria) 
    {
        switch(unObjeto)
        {
            /**saludables*/
            case 1: addObject(new Verdura(),apareceEnX,yAleatoria);
                    break;
            case 2: addObject(new Agua(),apareceEnX,yAleatoria);/*agrega un nuevo alimento solo es de prueba*/
                    break;
            case 3: addObject(new Pescado(),apareceEnX,yAleatoria);
                    break;
            /**frutas*/
            case 4: addObject(new Manzana(),apareceEnX,yAleatoria);
                    break;
            case 5: addObject(new Fresa(),apareceEnX,yAleatoria);
                    break;        
            case 6: addObject(new Platano(),apareceEnX,yAleatoria);
                    break;
            /**chatarra*/
            case 7: addObject(new Refresco(),apareceEnX,yAleatoria);
                    break;        
            case 8: addObject(new Cerveza(),apareceEnX,yAleatoria);
                    break;        
            case 9: addObject(new Hamburguesa(),apareceEnX,yAleatoria); /*agrega un nuevo peligro solo es de prueba*/
                    break;        
            case 10: addObject(new Pizza(),apareceEnX,yAleatoria);
                     break;        
            /**peligros con estos pierdes automaticamente*/
            case 11: addObject(new Vidrio(),apareceEnX,yAleatoria);
                     break;        
            case 12: addObject(new Alcantarilla(),apareceEnX,yAleatoria);
                     break;        
            case 13: addObject(new Bomba(),apareceEnX,yAleatoria);
                     break;
            /**Medicina cura la vida*/         
            case 14: addObject(new Curita(),apareceEnX,yAleatoria);
                     break;
            case 15: addObject(new Vacuna(),apareceEnX,yAleatoria);
                     break;
            case 16: addObject(new Vitamina(),apareceEnX,yAleatoria);
                     break;        
            /*Vida*/
            case 17: addObject(new Vida(),apareceEnX,yAleatoria);
                    break;
        }
        contadorAuxiliar=0;
    }
        
    /**Metodo scroll realiza las rotaciones de las imagenes 
     * colocando una enseguida de la otra a determinada velocidad
     */
    public void scroll()
    {        
        x1-=velocidad; /*mueve la imagen principal*/
        getBackground().drawImage(imgL12,x1,0);                 
        if(x1 >= 0)/*inicializa la segunada image enseguida de la primera*/
             x2 = 799;          
        if(x1 <= 0)
        { 
             getBackground().drawImage(imgL12,x2,0);/*mueve la imagen secundaria*/
             x2-=velocidad;/*mueve la imagen secundaria a una velocidad variable*/
        }
        if(x1 <= -799)
            x1 = velocidad; /*mueve la imagen primaria a una velocidad variable*/
    }
    
    /**metodo encargado de asignar automaticamente las velodicades de movimiento de scroll y de movimiento del jugador
     */
    public void asignaVelocidad()
    {
        int auxVel;
        auxVel=salud/10;
        velocidad=auxVel*4+1;
        aumentaDistancia=auxVel*(-250)+1000;
    }
    
    /** asigna la imagen segun el nivel en el que se encuentre el jugador
       */
    public void cambiaImagen()
    {
        switch(nivel)
        {
            case 2: imgL12=imgL2;
                    break;
            case 3: imgL12=imgL3;
                    break;
            case 4: imgL12=imgL4;
                    break;
        }
        
    }
    
    /**
     * Guarda los records en linea.
     */ 
    public void records(int puntos)
    {
        if (UserInfo.isStorageAvailable()) 
        {
            UserInfo myInfo = UserInfo.getMyInfo();
            /*if (puntos > myInfo.getScore()) 
            {*///al quitar estas lineas de comentario solo se guardaran los records que superen a la menor puntuacion 
                myInfo.setScore(puntos);
                myInfo.store();  // write back to server
            //}
        }
    }
    
    /**Aumenta la velocidad del mundo para aparentar de que se mueve mas rapido 
     * el personaje
     */
    public void aumentaVelocidad()
    {
        if(velocidad<=15)
            velocidad++;
    }
    
    /**Disminuye la velocidad del mundo para aparentar de que se mueve mas lento 
     * el personaje
     */
    public void disminuyeVelocidad()
    {
        if(velocidad>=1)
            velocidad--;
    }
    
    /**Reduce una vida del personaje si es que toco un objeto peligro
     * 
     */
    public void disminuyeVida()
    {
        vidas--;
        msjVidas.add(-1);
    }
    
    /**Incremeta en uno la vida del personaje, para ello el personaje 
     * debera recoger un objeto corazon
     */
    public void aumentaVida()
    {
        vidas++;
        msjVidas.add(+1);
    }
    
    /**
     * obtiene la velocidad del jugador
     */
    public int getVelocidad()
    {
        return velocidad;/*retorna la velocidad con la que deben moverse los objetos*/
    }
    
    /**Obetine el valor de la salud actual del personaje
     * @return salud regresa la salud del personaje
     */
    public int getSalud()
    {
        return salud;
    }
    
    public void reiniciaSalud(int unaSalud)
    {
        salud=unaSalud;
        msjSalud.setValue(10);
    }
    
    /**Modifica el valor de la salud del personaje dependiendo de que si
     * toco algun objeto chatarra la salud disminuye en cambio si todo
     * algun objeto saludable la salud aumenta
     */
    public void setSalud(int unaSalud)
    {
        if(salud<=100)
        {
            if(salud+unaSalud>100)
            {
                salud=100;
                msjSalud.setValue(100);
            }
            else
            {
                if(salud+unaSalud<=0)
                {
                    salud=10;
                    vidas--;
                    msjVidas.add(-1);
                    msjSalud.setValue(10);
                }
                else
                {
                    salud+=unaSalud;
                    msjSalud.add(unaSalud);
                }
            }
        }
    }
    
     public void stopped()
    {
        soundFondo.pause();
    }
    
    
    public void started()
    {
        soundFondo.play();
    }
           
}
    

